home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / dev / gcc / ixemul_src.lha / ixemul-41.0 / library / __fioctl.c < prev    next >
C/C++ Source or Header  |  1995-05-28  |  5KB  |  158 lines

  1. /*
  2.  *  This file is part of ixemul.library for the Amiga.
  3.  *  Copyright (C) 1991, 1992  Markus M. Wild
  4.  *
  5.  *  This library is free software; you can redistribute it and/or
  6.  *  modify it under the terms of the GNU Library General Public
  7.  *  License as published by the Free Software Foundation; either
  8.  *  version 2 of the License, or (at your option) any later version.
  9.  *
  10.  *  This library is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  *  Library General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU Library General Public
  16.  *  License along with this library; if not, write to the Free
  17.  *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  *
  19.  *  __fioctl.c,v 1.1.1.1 1994/04/04 04:29:44 amiga Exp
  20.  *
  21.  *  __fioctl.c,v
  22.  * Revision 1.1.1.1  1994/04/04  04:29:44  amiga
  23.  * Initial CVS check in.
  24.  *
  25.  *  Revision 1.1  1992/05/17  21:00:51  mwild
  26.  *  Initial revision
  27.  *
  28.  * Revision 1.1  1992/05/14  19:55:40  mwild
  29.  * Initial revision
  30.  *
  31.  */
  32.  
  33. #define KERNEL
  34. #include "ixemul.h"
  35. #include "kprintf.h"
  36. #include <sys/ioctl.h>
  37.  
  38. extern int __read(), __aread(), __write(), __awrite();
  39.  
  40. /* IOCTLs on files in general */
  41.  
  42. int
  43. __fioctl(struct file *f, unsigned int cmd, unsigned int inout,
  44.          unsigned int arglen, unsigned int arg)
  45. {
  46.   int omask;
  47.   int result;
  48.   int err=errno;
  49.   
  50.   omask = syscall (SYS_sigsetmask, ~0);
  51.   __get_file (f);
  52.  
  53.   switch (cmd)
  54.     {
  55.     case FIONREAD:
  56.       {
  57.     unsigned int *pt = (unsigned int *)arg;
  58.     if ( /* !IsInteractive(CTOBPTR(f->f_fh)) */
  59.         ! f->f_fh->fh_Port                      )
  60.       {
  61.         int this_pos, eof_pos;
  62.         /* so this must be some file-oriented device, could be
  63.          * a pipe, could be a normal file. Lets try to seek to
  64.          * the eof, if we can, we know, how many characters there
  65.          * are to be read. */
  66.         __wait_packet (&f->f_sp);
  67.         SendPacket3(f,__rwport,ACTION_SEEK,f->f_fh->fh_Arg1,0,OFFSET_CURRENT);
  68.         __wait_packet (&f->f_sp);
  69.         this_pos = LastResult (f);
  70.         if (LastError(f) == ERROR_ACTION_NOT_KNOWN) this_pos = -1;
  71.  
  72.         if (this_pos >= 0)
  73.           {
  74.         /* fine, the device seems at least to understand the
  75.          * Seek-Packet */
  76.         SendPacket3(f,__rwport,ACTION_SEEK,f->f_fh->fh_Arg1,0,OFFSET_END);
  77.         __wait_packet (&f->f_sp);
  78.         eof_pos = LastResult (f);
  79.         /* shouldn't happen here, I'm paranoid... */
  80.             if (LastError(f) == ERROR_ACTION_NOT_KNOWN) eof_pos = -1;
  81.  
  82.         /* since this was a real seek, the device could have
  83.          * signaled an error, if it just can't seek .. */
  84.         if (eof_pos >= 0)
  85.           {
  86.             *pt = eof_pos - this_pos;
  87.             SendPacket3(f,__rwport,ACTION_SEEK,f->f_fh->fh_Arg1,this_pos,OFFSET_BEGINNING);
  88.             __wait_packet (&f->f_sp);
  89.             LastResult(f) = 0;
  90.             result = 0;
  91.             goto ret;
  92.           }
  93.           }
  94.         /* well, since the device can't seek, AND it's not        
  95.          * interactive, chances are bad, we ever will get at the
  96.          * right result, but we'll try nevertheless the WaitForChar
  97.          * Packet, it can only fail... */
  98.       }
  99.     /* if the docs would all speak the same language... some
  100.      * say, that the timeout should be in 1/50s, others say
  101.      * its actually in micro/s.. who knows.. */
  102.     SendPacket1(f,__rwport,ACTION_WAIT_CHAR,10);
  103.     __wait_packet (&f->f_sp);
  104.  
  105.     *pt = LastResult(f) ? 1 : 0;
  106.     LastResult(f) = 0;
  107.     result = 0;
  108.         goto ret;
  109.       }
  110.  
  111.     case FIONBIO:
  112.       {
  113.     /* that's probably the most inefficient part of the whole
  114.      * library... */
  115.     result = f->f_flags & FNDELAY ? 1 : 0;
  116.     if (*(unsigned int *)arg)
  117.       f->f_flags |= FNDELAY;
  118.     else
  119.       f->f_flags &= ~FNDELAY;
  120.     /* I didn't find it documented in a manpage, but I assume, we
  121.      * should return the former state, not just zero.. */
  122.     goto ret;
  123.       }
  124.  
  125.     case FIOASYNC:
  126.       {
  127.     /* DOESN'T WORK YET */
  128.  
  129.     int flags = *(unsigned long*)arg;
  130.     result = f->f_flags & FASYNC ? 1 : 0;
  131.     if (flags)
  132.       f->f_flags |= FASYNC;
  133.     else
  134.       f->f_flags &= ~FASYNC;
  135.  
  136.     /* ATTENTION: have to call some function here in the future !!! */
  137.  
  138.     /* I didn't find it documented in a manpage, but I assume, we
  139.      * should return the former state, not just zero.. */
  140.     goto ret;
  141.       }
  142.  
  143.     case FIOCLEX:
  144.     case FIONCLEX:
  145.     case FIOSETOWN:
  146.     case FIOGETOWN:
  147.       /* this is no error, but nevertheless we don't take any actions.. */      
  148.       result = 0; goto ret;
  149.     }
  150.  
  151. ret:
  152.     __release_file (f);
  153.     syscall (SYS_sigsetmask, omask);
  154.     errno = err;
  155.     KPRINTF (("&errno = %lx, errno = %ld\n", &errno, errno));
  156.     return result;
  157. }
  158.